﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcMusicStore
{
    // Примечание: Инструкции по включению классического режима IIS6 или IIS7 
    // см. по ссылке http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public class HandleAllErrorAttribute : HandleErrorAttribute
        {

            /*
             AllowMultiple	Извлекает или задает значение, указывающее, можно ли задать для данного экземпляра несколько атрибутов файла. (Производный от FilterAttribute.)
	ExceptionType	Получает или задает тип исключения.
	Master	Получает или задает главное представление для отображения сведений об исключении.
	Order	Получает или задает порядок, в котором выполняются фильтры действий. (Производный от FilterAttribute.)
	TypeId	Получает уникальный идентификатор этого атрибута. (Переопределяет Attribute.TypeId.)
	View	Получает или задает представление страницы для отображения сведений об исключении.
             
             */

            /* Проверяет входные параметры на валидность
            Проверяет включены ли customErrors
            Заполняет данными класс HandleErrorInfo
            Создаёт новый ViewResult, заполняет данными и присваивает вместо текущего
            Очищает ошибки сервера и устанавливает код ответа сервера
             */
            public override void OnException(ExceptionContext filterContext)
            {
                if (filterContext == null)
                {
                    throw new ArgumentNullException("filterContext");
                }

                // If custom errors are disabled, we need to let the normal ASP.NET exception handler
                // execute so that the user can see useful debugging information.
                if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
                {
                    return;
                }

                Exception exception = filterContext.Exception;

                if (!ExceptionType.IsInstanceOfType(exception))
                {
                    return;
                }

                string controllerName = (string)filterContext.RouteData.Values["controller"];
                string actionName = (string)filterContext.RouteData.Values["action"];
                HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                filterContext.Result = new ViewResult
                {
                    ViewName = View,
                    MasterName = Master,
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                    TempData = filterContext.Controller.TempData
                };
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = new HttpException(null, exception).GetHttpCode();

                // Certain versions of IIS will sometimes use their own error page when
                // they detect a server error. Setting this property indicates that we
                // want it to try to render ASP.NET MVC's error page instead.
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            }
        }
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleAllErrorAttribute());
            //filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Имя маршрута
                "{controller}/{action}/{id}", // URL-адрес с параметрами
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Параметры по умолчанию
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}